package com.ysy.auth;

import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.exception.NotRoleException;
import cn.dev33.satoken.reactor.filter.SaReactorFilter;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import com.ysy.enums.ResponseCodeEnum;
import com.ysy.persimmons.common.exception.BaseException;
import com.ysy.persimmons.common.exception.ServiceException;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * [Sa-Token 权限认证] 配置类
 * @author click33
 */
@Configuration
public class SaTokenConfigure {
    // 注册 Sa-Token全局过滤器
    @Bean
    public SaReactorFilter getSaReactorFilter() {
        return new SaReactorFilter()
                // 拦截地址
                .addInclude("/**")    /* 拦截全部path */
                // 开放地址
                .addExclude("/favicon.ico")
                // 鉴权方法：每次访问进入
                .setAuth(obj -> {
                    // 登录校验 -- 拦截所有路由，并排除/auth/login 用于开放登录
                   // SaRouter.match("/**", "/auth/login", r -> StpUtil.checkLogin());
                    // 权限认证 -- 不同模块, 校验不同权限
//                    SaRouter.match("/user/**", r -> StpUtil.checkPermission("user"));
                    SaRouter.match("/**")
                            .notMatch("/auth/login") // 排除登录接口
//                            .notMatch("/auth/verification/code/send") // 排除验证码发送接口
//                            .notMatch("/note/channel/list") // 排除获取频道接口
//                            .notMatch("/note/discover/note/list") // 发现页-查询笔记列表
//                            .notMatch("/note/profile/note/list") // 个人主页-查询笔记列表
//                            .notMatch("/note/note/detail") // 查询笔记详情
//                            .notMatch("/note/note/isLikedAndCollectedData")
//                            .notMatch("/comment/comment/list") // 查询评论分页数据
//                            .notMatch("/comment/comment/child/list") // 查询评论分页数据
//                            .notMatch("/user/user/profile") // 查询评论分页数据
//                            .notMatch("/search/search/note") // 笔记搜索
                            .check(r -> StpUtil.checkLogin()); // 校验是否登录
                    // 更多匹配 ...  */
                })
                // 异常处理方法：每次setAuth函数出现异常时进入
                .setError(e -> {
                    if (e instanceof NotLoginException) {
                        throw new ServiceException(ResponseCodeEnum.NO_LOGIN_CHECK);
                    } else if (e instanceof NotPermissionException || e instanceof NotRoleException) {
                        throw new NotPermissionException(e.getMessage());
                    } else {
                        throw new RuntimeException(e);
                    }
                });
    }
}

